package com.cskaoyan.javase.exception._1handle._3throws;

/**
 * @description: 异常的抛出-throws
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * throws关键字在方法的声明中使用,它表示方法可能抛出异常的列表,表示抛出异常的可能性(不是一定要抛出异常)
 * 语法:
 *      方法名(形参列表) throws 异常列表{
 *       }
 * 解释:
 *      1.异常列表可以是多个,不同异常类型之间用","隔开.由于是表示抛出异常的可能性,不需要明确抛出异常对象
 *          所以异常列表的语法是:
 *              异常类型类名1,异常类型类名2.....
 *
 *       2.该声明仅仅表示方法可能会抛出异常,具体到底抛不抛出,要看方法体中代码的执行结果
 *       3.throws+运行时异常是没有任何意义的,运行时异常默认就会往上抛出,不需要使用throws声明
 *          所以不要使用throws在方法声明中表示抛出运行时异常(因为写和不写是一样)
 *       4.throws+编译时异常才是有意义的写法,它表示程序可能会抛出一个编译时异常,
 *          实质上throws抛出就是编译时异常的一种处理方式
 *       5.在方法声明中如果使用throws+编译时异常,表示该方法可能抛出编译时异常,
 *          那么该方法在被调用时,就必须处理这个编译时异常
 *          但是具体会不会抛出这个异常,还是需要看代码的执行结果
 *
 *       6.编译时异常在处理时,可以选择直接在方法内部进行try...catch处理
 *          也可以用throws在方法声明中将它抛给上层方法调用者
 *          这两种处理方式,根据情况选择
 *          但是建议在main方法中就不要再抛出了,而是直接处理
 *
 *       7.列表中出现的异常如果有父子关系，那么编译器只会强制要求处理父类
 *
 * 总结三个问题:
 *      1.throws+运行时异常,有没有作用,对方法的调用有没有影响?
 *          没有意义,默认情况下运行时异常自己就会往上抛出,不需要声明
 *
 *      2.throws+编译时异常,有没有作用,对方法的调用有没有影响?
 *          有作用,因为编译时异常必须在编译时期处理它,而向上抛出也是一种处理方式
 *          一旦方法声明中明确要抛出编译时异常,那么方法调用处一定要处理该异常
 *
 *      3.throws在使用后,到底要不要抛出异常,是什么决定的?
 *          是方法体中代码执行结果决定的
 *
 */
public class Demo {
    public static void main(String[] args) {
        //Unhandled exception: java.lang.CloneNotSupportedException
        System.out.println("before");
        try {
            method();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        System.out.println("after");


        try {
            method2();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void test() throws NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException {
        System.out.println("hello world!");
        System.out.println(10 / 0);
    }

    public static void method() throws CloneNotSupportedException {
        Demo d = new Demo();
        d.clone();
    }

    public static void method2() throws Exception, CloneNotSupportedException, RuntimeException {
    }
}
